Circular Reference কি এবং এর সমস্যা

Java Technologies - জ্যাকসন (Jackson) - Circular References এবং Bidirectional Relationships হ্যান্ডল করা
188

Circular Reference বলতে বোঝায়, যখন দুটি বা তার চেয়ে বেশি অবজেক্ট একে অপরকে রেফার করে এবং এর ফলে একটি রেফারেন্স চক্র তৈরি হয়। Jackson-এর মতো লাইব্রেরি ব্যবহার করে JSON Serialization বা Deserialization করার সময় Circular Reference সমস্যা দেখা দিতে পারে।


Circular Reference উদাহরণ

উদাহরণ:

public class CircularReferenceExample {
    public static void main(String[] args) {
        try {
            ObjectMapper objectMapper = new ObjectMapper();

            // Parent এবং Child Object তৈরি
            Parent parent = new Parent();
            Child child = new Child();

            // Circular Reference
            parent.setChild(child);
            child.setParent(parent);

            // JSON Serialization
            String json = objectMapper.writeValueAsString(parent);
            System.out.println("Serialized JSON: " + json);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Parent {
    private String name = "Parent";
    private Child child;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Child getChild() {
        return child;
    }

    public void setChild(Child child) {
        this.child = child;
    }
}

class Child {
    private String name = "Child";
    private Parent parent;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Parent getParent() {
        return parent;
    }

    public void setParent(Parent parent) {
        this.parent = parent;
    }
}

সমস্যা:

Serialization চলাকালীন Jackson Parent এবং Child এর রেফারেন্স বারবার প্রসেস করতে গিয়ে StackOverflowError সৃষ্টি করবে।


Circular Reference সমস্যার কারণ

  1. Recursive References:
    • Parent একটি Child রেফার করে, এবং সেই Child আবার Parent রেফার করে। এই চক্র চলতেই থাকে।
  2. Serialization Logic:
    • Jackson ডিফল্টভাবে সমস্ত রেফারেন্স JSON-এ রূপান্তর করার চেষ্টা করে, যা একটি অসীম লুপের সৃষ্টি করে।

Circular Reference এর সমাধান

১. @JsonManagedReference এবং @JsonBackReference ব্যবহার

Jackson Circular Reference সমস্যা সমাধানের জন্য @JsonManagedReference এবং @JsonBackReference সরবরাহ করে।

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;

class Parent {
    private String name = "Parent";

    @JsonManagedReference
    private Child child;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Child getChild() {
        return child;
    }

    public void setChild(Child child) {
        this.child = child;
    }
}

class Child {
    private String name = "Child";

    @JsonBackReference
    private Parent parent;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Parent getParent() {
        return parent;
    }

    public void setParent(Parent parent) {
        this.parent = parent;
    }
}

আউটপুট:

{
  "name": "Parent",
  "child": {
    "name": "Child"
  }
}

২. @JsonIdentityInfo ব্যবহার

আপনি Circular Reference সমাধানের জন্য @JsonIdentityInfo ব্যবহার করতে পারেন। এটি Object-এর ID ব্যবহার করে রেফারেন্স ট্র্যাক করে।

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
class Parent {
    private int id = 1;
    private String name = "Parent";
    private Child child;

    public int getId() {
        return id;
    }

    public Child getChild() {
        return child;
    }

    public void setChild(Child child) {
        this.child = child;
    }
}

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
class Child {
    private int id = 2;
    private String name = "Child";
    private Parent parent;

    public int getId() {
        return id;
    }

    public Parent getParent() {
        return parent;
    }

    public void setParent(Parent parent) {
        this.parent = parent;
    }
}

আউটপুট:

{
  "id": 1,
  "name": "Parent",
  "child": {
    "id": 2,
    "name": "Child",
    "parent": 1
  }
}

৩. Serialization Views ব্যবহার

Serialization Views ব্যবহার করে আপনি নির্দিষ্ট অংশ Serialize করতে পারেন এবং Circular Reference এড়াতে পারেন।


৪. @JsonIgnore ব্যবহার

যদি কোনো ফিল্ড Serialize না করা প্রয়োজন হয়, তাহলে @JsonIgnore ব্যবহার করা যায়।

class Child {
    private String name = "Child";

    @JsonIgnore
    private Parent parent;

    // Getters and Setters
}

Circular Reference সমস্যা সমাধানের সেরা পদ্ধতি

  • যদি Parent-Child সম্পর্ক থাকে: @JsonManagedReference এবং @JsonBackReference
  • যদি Object ID ব্যবহার করতে চান: @JsonIdentityInfo
  • যদি নির্দিষ্ট ফিল্ড বাদ দিতে চান: @JsonIgnore

  • Circular Reference হল অবজেক্টের একে অপরকে রেফার করার একটি চক্র যা JSON Serialization-এর সময় সমস্যার সৃষ্টি করে।
  • Jackson-এর @JsonManagedReference, @JsonBackReference, এবং @JsonIdentityInfo এর মতো টুল ব্যবহার করে এই সমস্যা সহজেই সমাধান করা যায়।
  • আপনার প্রয়োজন এবং ডেটা মডেলের উপর ভিত্তি করে সঠিক পদ্ধতি নির্বাচন করুন।
Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...